home *** CD-ROM | disk | FTP | other *** search
-
- /* Datei-Viewer (optional auch als Clipboard-Viewer durch Definition
- des Makros 'CLIPVIEW', s. 'CLIPVIEW.PRJ') als "nützliches" Beispiel-
- programm zur EnhancedGEM-Library
- (läuft als Programm und als Accessory), (c) 1994 C. Grunenberg */
-
- /* Clipboard-Viewer: Wertet die Nachrichten AV_PATH_UPDATE, SC_CHANGED
- und SH_WDRAW aus, um eine Veränderung des Clipboards
- festzustellen. Per Doppelklick oder Ctrl-O/H/V kann
- die Anzeige manuell aktualisiert werden
-
- Datei-Viewer: Unterstützt sowohl Drag & Drop nach allen gängigen
- Varianten als auch das View-Protokoll und die
- Nachricht VA_START. Dargestellt werden können mono-
- chrome Images, Texte und Binärdateien als Dump.
- Per Doppelklick oder Ctrl-O/H kann der Fileselector
- aufgerufen werden. */
-
- #include "winview.h"
-
- /* Wird die folgende Definition eingebunden, so haben die Fenster
- keine Slider. Die Library hat damit natürlich keine Probleme und
- man kann die volle Geschwindigkeit der Scrollroutinen genießen, d.h.
- man kann weiterhin per Tastatur oder Maus (Mausklick in Arbeitsbereich
- und bei gedrückter Maustaste die Maus in gewünschte Richtung verschieben)
- scrollen */
-
- /*
- #undef GADGETS
- #define GADGETS NAME|CLOSER|FULLER|MOVER|INFO|SIZER|UPARROW|DNARROW|LFARROW|RTARROW|SMALLER
- */
-
- /* verschiedene Mausformen für die Funktion window_set_mouse() */
- MFORM mouse_v = {7,7,1,BLACK,WHITE,
- { 0x0180, 0x03C0, 0x07E0, 0x0FF0, 0x07E0, 0x03C0, 0x03C0, 0x03C0,
- 0x03C0, 0x03C0, 0x03C0, 0x07E0, 0x0FF0, 0x07E0, 0x03C0, 0x0180 },
- { 0x0000, 0x0180, 0x03C0, 0x05A0, 0x0180, 0x0180, 0x0180, 0x0180,
- 0x0180, 0x0180, 0x0180, 0x0180, 0x05A0, 0x03C0, 0x0180, 0x0000 }};
-
- MFORM mouse_h = {7,7,1,BLACK,WHITE,
- { 0x0000, 0x0000, 0x0000, 0x0000, 0x1008, 0x381C, 0x7FFE, 0xFFFF,
- 0xFFFF, 0x7FFE, 0x381C, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000 },
- { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1008, 0x2004, 0x7FFE,
- 0x7FFE, 0x2004, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }};
-
- MFORM mouse_vh = {7,7,1,BLACK,WHITE,
- { 0x0180, 0x03C0, 0x07E0, 0x0FF0, 0x17E8, 0x3BDC, 0x7FFE, 0xFFFF,
- 0xFFFF, 0x7FFE, 0x3BDC, 0x17E8, 0x0FF0, 0x07E0, 0x03C0, 0x0180 },
- { 0x0000, 0x0180, 0x03C0, 0x05A0, 0x0180, 0x1188, 0x2184, 0x7FFE,
- 0x7FFE, 0x2184, 0x1188, 0x0180, 0x05A0, 0x03C0, 0x0180, 0x0000 }};
-
- /* Scancodes für Tastaturscrolling */
- KEY scroll_keys[] = {
- {SCANUP,PAGE_UP,LINE_UP},
- {SCANDOWN,PAGE_DOWN,LINE_DOWN},
- {SCANLEFT,LINE_START,LINE_LEFT},
- {SCANRIGHT,LINE_END,LINE_RIGHT},
- {SCANHOME,WIN_END,WIN_START} };
-
- /* SCROLL-Struktur für automatisches Scrolling */
- SCROLL scroll;
-
- /* Zeiger auf Fenster-Struktur */
- WIN *window;
-
- /* Rechteck für maximale Fensterausmaße */
- GRECT max_win;
-
- /* Zeichenkette für Infozeile des Fensters */
- char info[256];
-
- #ifdef CLIPVIEW
-
- char *entry = " ClipboardViewer"; /* Eintrag im DESK-Menü */
- char *xacc_name = "ClipboardViewer"; /* XAcc2-Programmname */
- char *av_name = "CLIPVIEW"; /* AV-Programmname */
- char *title = "ClipboardViewer"; /* Fenster-Titel */
- char *small_title = "ClipView"; /* und im ikonifizierten Zustand */
-
- #else
-
- char *entry = " WindowViewer"; /* Eintrag im DESK-Menü */
-
- /* XAcc2-Programmname */
- char *xacc_name = "WindowViewer\0XDSC\0""1Dateiviewer\0""2View\0NView\0X.ASC\0X.HEX\0XDump\0X.IMG\0";
-
- char *av_name = "WINVIEW"; /* AV-Programmname */
- char *title = "WindowViewer"; /* Fenster-Titel */
-
- /* Fenster-Titel im ikonifizierten Zustand zeigt auf Dateinamen der
- geladenen Datei */
- #define small_title GetFilename(file_loaded)
-
- /* Pfad- und Dateinamen */
- char path[MAX_PATH],fname[MAX_PATH];
-
- #endif
-
- /***********************************************************************
- Fehlermeldung ausgeben
- ***********************************************************************/
- void error(int icon,char *msg)
- {
- xalert(1,1,icon,NULL,SYS_MODAL,BUTTONS_RIGHT,TRUE,title,msg,"[Got it!");
- }
-
- /***********************************************************************
- Fenster-Scroll-Struktur initialisieren
- ***********************************************************************/
- void SetWindow(void)
- {
- scroll.hpos = scroll.vpos = 0; /* linke/obere Ecke */
-
- switch (loaded)
- {
- /* Image geladen */
- case TRUE:
- scroll.hsize = img_w; /* Spalten = Breite */
- scroll.vsize = img_h; /* Zeilen = Höhe */
- scroll.px_hline = scroll.px_vline = 1; /* Breite/Höhe einer Spalte/Zeile in Pixel */
- scroll.hscroll = scroll.vscroll = 4; /* Scroll-Schrittweite */
- /* Infozeile des Fensters setzen */
- sprintf(info," %s, %d x %d Pixel",file_loaded,img_w,img_h);
- break;
- /* Text- oder Binär-Datei (Dump) geladen */
- case FAIL:
- scroll.hsize = text_rows + text_tabs*(tab_size-1) + 1; /* Spalten */
- scroll.vsize = text_lines; /* Zeilen */
- scroll.px_hline = gr_cw; /* Breite einer Spalte in Pixel */
- scroll.px_vline = gr_ch; /* Höhe einer Zeile in Pixel */
- scroll.hscroll = scroll.vscroll = 1; /* Scroll-Schrittweite */
-
- /* Text-Datei geladen? */
- if (ascii)
- /* Infozeile des Fensters setzen */
- sprintf(info," %s, %d Line(s), Tab: %d",file_loaded,text_lines,tab_size);
- else
- /* Infozeile des Fensters setzen */
- sprintf(info," %s, %ld Bytes",file_loaded,dump_size);
- break;
- #ifdef CLIPVIEW
- default:
- /* Keine Datei geladen */
- scroll.hsize = scroll.vsize = 0; /* keine Zeilen/Spalten */
- strcpy(info," No file in clipboard."); /* Infozeile des Fensters setzen */
- #endif
- }
- }
-
- /***********************************************************************
- Fenster schließen, Speicher freigeben und Programm beenden
- ***********************************************************************/
- void CloseWindow(void)
- {
- if (window) /* Fenster geöffnet? */
- {
- ClearData(); /* Speicher freigeben */
- close_window(window,FALSE); /* Fenster schließen (keine Shrink-Boxen) */
- window = NULL;
- if (!_app)
- MouseArrow(); /* Maus zurücksetzen, falls als Accessory geladen */
- }
-
- if (_app) /* Als Programm gestartet? */
- exit_gem(0); /* Programm beenden (Rückgabewert: 0) */
- }
-
- /***********************************************************************
- Fenster-abhängige Mausform setzen
- ***********************************************************************/
- void Mouse(void)
- {
- int mouse,dx,dy;
- MFORM *mf;
-
- /* benutzerdefinierte Mausform */
- mouse = USER_DEF;
-
- /* Fensterinhalt breiter als eine Fensterseite? */
- dx = scroll.hsize-scroll.hpage;
-
- /* Fensterinhalt höher als eine Fensterseite? */
- dy = scroll.vsize-scroll.vpage;
-
- /* vertikales & horizontales Scrolling möglich? */
- if (dx>0 && dy>0)
- mf = &mouse_vh;
- /* horizontales Scrolling möglich? */
- else if (dx>0)
- mf = &mouse_h;
- /* vertikales Scrolling möglich? */
- else if (dy>0)
- mf = &mouse_v;
- else
- {
- /* ansonsten Maus auf Fadenkreuz (Image) bzw. Text-Cursor (Text,
- Dump) innerhalb des Arbeitsbereichs setzen */
- mouse = (loaded==TRUE) ? THIN_CROSS : TEXT_CRSR;
- mf = NULL;
- }
-
- /* Mausform setzen (außerhalb des Arbeitsbereichs als Pfeil) */
- window_set_mouse(window,mouse,ARROW,mf,NULL);
- }
-
- /***********************************************************************
- Fenster öffnen, evtl. Fileselector aufrufen und Datei laden
- ***********************************************************************/
- void OpenWindow(char *file)
- {
- #ifdef CLIPVIEW
- /* vorherigen Clipboard-Inhalt löschen */
- ClearData();
-
- /* Clipboard-Dateien (Image, Text) suchen */
- if (scrp_find("img.txt.asc.rtf.tex.csv.eps.*",file_loaded))
- /* Datei laden, falls vorhanden */
- LoadData(file_loaded);
-
- /* Scroll-Struktur initialisieren */
- SetWindow();
-
- /* maximale Fensterausmaße in Abhängigkeit vom Ladezustand berechnen */
- if (loaded)
- window_border(GADGETS,0,0,scroll.hsize*scroll.px_hline,scroll.vsize*scroll.px_vline,&max_win);
- else
- {
- max_win = desk;
- max_win.g_w >>= 1;
- max_win.g_h >>= 1;
- }
- #else
- /* Pfad- und Dateiname übergeben? */
- if (file && *GetFilename(file)=='\0')
- {
- /* nur Pfad übergeben */
- strcpy(path,file);
- file = NULL;
- }
-
- /* Fileselector aufrufen, falls keine Datei übergeben wurde */
- if (file || FileSelect("Load file...",path,fname,NULL,TRUE))
- {
- /* kompletten Pfad der Datei kopieren/erstellen */
- if (file)
- strcpy(file_loaded,file);
- else
- MakeFullpath(file_loaded,path,fname);
-
- /* Datei laden */
- if (LoadData(file_loaded)) /* Wurde Datei geladen? */
- {
- /* Scroll-Struktur initialisieren */
- SetWindow();
- /* maximale Fensterausmaße berechnen */
- window_border(GADGETS,0,0,scroll.hsize*scroll.px_hline,scroll.vsize*scroll.px_vline,&max_win);
- #endif
- /* Fenster noch nicht geöffnet? */
- if (window==NULL)
- {
- /* Fenster öffnen */
- window = open_window(title,small_title,info,NULL,GADGETS,FALSE,MINSIZE,MINSIZE,&max_win,&desk,&scroll,Draw);
- if (window==NULL)
- /* Fenster konnte nicht geöffnet werden */
- error(X_ICN_ALERT,"No more windows available!");
- }
- else
- {
- #ifndef CLIPVIEW
- /* Größe auf Maximalbereich setzen */
- window->curr = max_win;
- #endif
- /* Fenster reinitialisieren (Fensterausmaße, -titel, -infozeile) */
- window->max = max_win;
- window_reinit(window,title,small_title,info,TRUE);
- }
- #ifndef CLIPVIEW
- }
- /* keine Datei geladen? */
- else if (loaded==FALSE)
- /* Nein -> Fenster schließen, falls vorher geöffnet */
- CloseWindow();
- }
- #endif
-
- /* Fenster geöffnet? */
- if (window)
- /* Mauszeigerform setzen */
- Mouse();
- else
- /* ansonsten evtl. Programm beenden */
- CloseWindow();
- }
-
- /***********************************************************************
- Initialisierungs-Routine, welche die Event-Struktur setzt sowie die
- Ereignisse, die von der Applikation benötigt werden, zurückgibt
- ***********************************************************************/
- int InitEvent(XEVENT *ev,int avail)
- {
- /* auf Nachrichten und Tastendrücke warten */
- int flags = MU_MESAG|MU_KEYBD;
-
- /* Fenster geöffnet? */
- if (window)
- {
- /* Fenster ist oberstes Fenster sowie nicht ikonifiziert und
- erstes Rechtech-Ereignis ist verfügbar? */
- if (window->inside>=0 && (avail & MU_M1))
- {
- /* Betreten/Verlassen des Arbeitsbereiches überwachen */
- ev->ev_mm1flags = window->inside;
- *(GRECT *) &ev->ev_mm1x = window->work;
- flags |= MU_M1;
- }
-
- /* erstes Button-Ereignis verfügbar? */
- if (avail & MU_BUTTON1)
- {
- /* Einfach-/Doppelklick links */
- ev->ev_mb1clicks = 2;
- ev->ev_mb1state = ev->ev_mb1mask = 1;
- flags |= MU_BUTTON1;
- }
- }
-
- /* gewünschte Ereignisse zurückgeben */
- return (flags & avail);
- }
-
- /***********************************************************************
- Ereignisauswertung (AES-Nachrichten, Mausklicks/-bewegung, Tastendrücke)
- ***********************************************************************/
- int Event(XEVENT *ev)
- {
- WIN *win;
- int *msg,wich = ev->ev_mwich,scan,state,used=0,i,k,x,y,old_x,old_y;
- KEY *keys;
-
- #ifdef CLIPVIEW
- char scrap[MAX_PATH],*path;
- #endif
-
- /* Mausklick links? */
- if (wich & MU_BUTTON1)
- {
- /* Doppelklick links? */
- if (ev->ev_mbreturn==2)
- /* Fileselector aufrufen und Text laden */
- OpenWindow(NULL);
- /* Einfackklick in Arbeitsbereich und Fenster nicht ikonifiziert? */
- else if (!window->iconified && rc_inside(ev->ev_mmox,ev->ev_mmoy,&window->work))
- {
- /* Durch dieses Codesegment kann man den Fensterinhalt scrollen,
- indem man in das Fenster klickt und bei gedrückter Maustaste
- die Maus bewegt! */
-
- /* alte Mausposition merken */
- old_x = ev->ev_mmox;
- old_y = ev->ev_mmoy;
-
- /* Maus ausschalten und wind_update()-Status setzen */
- wind_update(BEG_MCTRL);
- MouseOff();
-
- do
- {
- /* Maustaste und -position ermitteln */
- graf_mkstate(&x,&y,&k,&i);
- /* Wurde Maus bewegt? */
- if (x!=old_x || y!=old_y)
- {
- /* entsprechend der Verschiebung die Fensterposition
- ändern */
- scroll.hpos += (x-old_x)*scroll.hscroll;
- scroll.vpos += (y-old_y)*scroll.vscroll;
- /* Fenster scrollen */
- scroll_window(window,WIN_SCROLL,NULL);
- /* Mausposition merken */
- old_x = x;
- old_y = y;
- }
- } while (k & 1); /* solange linke Maustaste gedrückt */
-
- /* Maus anschalten und wind_update()-Status löschen */
- MouseOn();
- wind_update(END_MCTRL);
- }
-
- /* Button-Event wurde ausgewertet */
- used |= MU_BUTTON1;
- }
-
- /* Maus-Ereignis? (Maus hat Arbeitsbereich betreten/verlassen) */
- if (wich & MU_M1)
- {
- /* Mausform aktualisieren */
- window_mouse(window);
- /* Mouse-Event wurde ausgewertet */
- used |= MU_M1;
- }
-
- /* Nachricht vom AES oder der Library? */
- if (wich & MU_MESAG)
- {
- /* Adresse des Nachrichten-Puffers */
- msg = ev->ev_mmgpbuf;
-
- /* Fenster zu Fenster-Nachricht ermitteln */
- win = get_window(msg[3]);
-
- /* Event wurde ausgewertet */
- used |= MU_MESAG;
-
- switch (msg[0])
- {
- case AC_OPEN:
- /* (Fileselector aufrufen und) Datei/Klemmbrett laden */
- OpenWindow(NULL);
- break;
- case AC_CLOSE:
- case AP_TERM:
- case WM_CLOSED:
- /* Fenster schließen und Programm evtl. beenden */
- CloseWindow();
- break;
- case WM_TOPPED:
- /* Fenster nach oben holen */
- window_top(win);
- break;
- case WM_BOTTOMED:
- /* Fenster nach unten legen */
- window_bottom(win);
- break;
- case WM_FULLED:
- /* Fenster auf maximale oder vorherige Ausmaße setzen */
- *(GRECT *) &msg[4] = (win->fulled) ? win->prev : win->max;
- case WM_SIZED:
- case WM_MOVED:
- /* neue Fensterposition/-größe setzen */
- window_size(win,(GRECT *) &msg[4]);
- /* Mausform setzen */
- Mouse();
- break;
- #ifdef CLIPVIEW
- /* Inhalt eines Laufwerks wurde verändert */
- case SH_WDRAW:
- /* Klemmbrett vorhanden? */
- if (scrp_path(scrap,NULL))
- /* Alle Laufwerke oder das Klemmbrett-Laufwerk betroffen? */
- if (msg[3]<0 || GetDrive(scrap)==msg[3])
- /* Klemmbrett aktualisieren */
- OpenWindow(NULL);
- break;
- /* Inhalt eines Pfades wurde verändert */
- case AV_PATH_UPDATE:
- /* Klemmbrett vorhanden? */
- if (scrp_path(scrap,NULL))
- {
- /* Pfad, dessen Inhalt sich geändert hat */
- path = *(char **) &msg[3];
- /* übergeordneter Pfad des Klemmbretts? */
- if (!strnicmp(scrap,path,strlen(path)))
- /* Klemmbrett aktualisieren */
- OpenWindow(NULL);
- }
- break;
- /* Inhalt des Klemmbretts hat sich geändert */
- case SC_CHANGED:
- /* Klemmbrett aktualisieren */
- OpenWindow(NULL);
- break;
- #else
- /* Datei soll angezeigt werden (View-Protokoll) */
- case VIEW_FILE:
- /* Nachricht positiv beantworten */
- AvSendMsg(msg[1],VIEW_OPEN,msg);
- /* Datei laden und anzeigen */
- OpenWindow(*(char **) &msg[3]);
- break;
- /* Datei/Pfad wurde per Drag&Drop übergeben */
- case OBJC_DRAGGED:
- /* Datei laden und anzeigen */
- OpenWindow((*(DRAG_DROP **) &msg[4])->dd_args);
- break;
- #endif
- default:
- /* unbekannte Nachricht konnte nicht ausgewertet werden */
- used &= ~MU_MESAG;
- }
- }
-
- /* Tastatur-Ereignis? */
- if (wich & MU_KEYBD)
- {
- /* Status der Umschalttasten */
- state = ev->ev_mmokstate;
- /* Scancode der gedrückten Taste */
- scan = ev->ev_mkreturn;
- /* Zeichen der gedrückten Taste ermitteln */
- k = scan_2_ascii(scan,state);
- scan >>= 8;
-
- /* Control-Taste gedrückt? */
- if (state & K_CTRL)
- {
- /* Keyboard-Event wurde ausgewertet */
- used |= MU_KEYBD;
-
- /* Pfeil links und Datei geladen? */
- if (scan==CTRLLEFT)
- {
- if (loaded)
- /* Seite nach links scrollen */
- scroll_window(window,PAGE_LEFT,NULL);
- }
- /* Pfeil rechts und Datei geladen? */
- else if (scan==CTRLRIGHT)
- {
- if (loaded)
- /* Seite nach rechts scrollen */
- scroll_window(window,PAGE_RIGHT,NULL);
- }
- /* Ctrl-Q oder Ctrl-U? */
- else if (strchr("QU",k))
- /* Fenster schließen und evtl. Programm beenden */
- CloseWindow();
- #ifdef CLIPVIEW
- /* Ctrl-O, Ctrl-H oder Ctrl-V? */
- else if (strchr("OHV",k))
- /* Klemmbrett aktualisieren */
- #else
- /* Ctrl-O oder Ctrl-H? */
- else if (strchr("OH",k))
- /* Fileselector aufrufen und Datei laden */
- #endif
- OpenWindow(NULL);
- else
- /* unbekannte Taste */
- used &= ~MU_KEYBD;
- }
- /* Datei geladen? */
- else if (loaded)
- {
- /* Tab-Taste gedrückt? */
- if (scan==SCANTAB)
- {
- /* neue Tabulator-Größe setzen */
- if (tab_size==0)
- tab_size++;
- else
- tab_size = (tab_size*2)&15;
-
- /* Fenster initialisieren, falls es sich um eine Text-
- Datei handelt und diese Tabulatoren enthält */
- if (loaded==FAIL && ascii && text_tabs)
- {
- SetWindow();
- window_reinit(window,title,small_title,info,FALSE);
- }
-
- used |= MU_KEYBD;
- }
- else
- /* Pfeil-Taste -> Fenster scrollen */
- for (keys=&scroll_keys[0],i=0;i<sizeof(scroll_keys);i++,keys++)
- if (keys->scan==scan)
- {
- scroll_window(window,(state & (K_RSHIFT|K_LSHIFT)) ? keys->shift : keys->norm,NULL);
- used |= MU_KEYBD;
- break;
- }
- }
- }
-
- /* ausgewertete Ereignisse zurückgeben */
- return (used);
- }
-
- void main(int argc,char **argv)
- {
- /* Bibliothek sowie AES, VDI und Protokolle initialisieren
- (keine anwendungspezifische AV/XAcc-Nachrichtenauswertung,
- Clipboard-Viewer unterstützt AV_PATH_UPDATE)) */
- if (init_gem(entry,xacc_name,av_name,0,0,0)==TRUE)
- {
- /* automatisches Scrolling */
- scroll.scroll = TRUE;
-
- #ifndef CLIPVIEW
- /* aktuellen Pfad ermitteln (für Fileselectoraufruf) */
- getcwd(path,(int) sizeof(path));
- #endif
-
- /* Ereignis-Routinen anmelden */
- Event_Handler(InitEvent,Event);
-
- /* als Programm gestartet? */
- if (_app)
- /* Fileselector aufrufen oder übergebene Datei laden */
- OpenWindow((argc>1) ? argv[1] : NULL);
-
- /* ...und los geht's */
- Event_Multi(NULL);
- }
- }
-